前幾天我在重構健身紀錄系統的前端邏輯時,發現一件有趣又慘痛的事。
那天我只是單純想「讓程式更乾淨一點」,於是打開 Cursor,對它說:
「幫我重構一下這段 Redux Toolkit 的程式,邏輯保持不變。」
結果,它真的很聽話——太聽話了。
重構後的程式碼看起來乾淨到不行,變數名稱漂亮、結構整齊,甚至還幫我刪了幾個看起來「多餘」的 useEffect。
我看了覺得滿意,直接 commit。
結果一跑起來,資料不更新、按鈕沒反應,整個流程像被拔掉靈魂一樣。
一開始我以為是 Axios 拿到的資料有問題,
後來才發現——Cursor 把我某個 dispatch 的時機點改掉了。
原本的程式是這樣:
useEffect(() => { if (userId) { dispatch(fetchWorkoutRecords(userId)); } }, [userId]);
Cursor 重構後,它幫我「聰明優化」成這樣:
if (userId) { dispatch(fetchWorkoutRecords(userId)); }
看起來乾淨多了,對吧?
但問題是——這樣一來,component mount 時根本沒執行!
AI 看程式的邏輯是靜態的,它不會真的去「跑」一次你的應用程式。
它看到的只是「語法」,而不是「生命週期」。
對它來說,把 useEffect 拿掉只是結構重整;
但對 React 來說,那是一整個執行順序的改變。
當下我突然意識到一件事:
AI 可以幫我寫 Code,但它並不知道程式是「什麼時候該跑」的。
後來我不是直接改回去,而是反過來問 Cursor:
「你為什麼把 useEffect 拿掉?你覺得這樣會有什麼影響?」
這時候它的回答很有趣:
「我假設 dispatch 是在 render 階段即可安全執行,因為 useEffect 沒有副作用。」
看到這句我笑出來。
AI 真心覺得「dispatch」不是副作用。
這就是我學到的另一件事——AI 不一定懂語意,只會照著語法去判斷。
現在我用 Cursor 時,多了一個小習慣:
讓它重構完,我會馬上問一句「請幫我說明你改了哪些地方,為什麼要改」。
這句話超有用。
你會發現它常常會幫你「誠實列出」所有改動點,有時還會自己意識到改錯。
這次事件讓我更確定一件事:
AI 開發不是「取代人」,而是「放大錯誤的速度」——如果你不懂原本的邏輯,它會讓你更快崩潰。
AI 工具很強,特別是 Cursor、Gemini、Claude 這些都能幫你節省大量時間。
但開發最危險的地方不在「它寫錯」,而在「它寫對但語意錯」。
程式看起來完美無缺,卻在流程中靜靜失效。
重構從來都不只是讓 Code 漂亮,
而是要讓它「在正確的時機」做正確的事。